package com.feimt.web;


import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
import com.alipay.api.internal.util.AlipaySignature;
import com.feimt.common.R;
import com.feimt.pojo.Orders;
import com.feimt.service.AlipayService;
import com.feimt.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/alipay")
@Slf4j
public class AlipayController {

    @Autowired
    private Environment env;
    @Autowired
    private OrderService orderService;
    @Autowired
    private AlipayService alipayService;
    /**
     * 支付宝--->系统
     * alipay--->localhost windows 网关
     * @param params
     * @return
     */
    @PostMapping("/notify")
    public String notify(@RequestParam Map<String, String> params){
        log.info("支付通知正在执行");
        log.info("通知参数 ===> {}", params);
        String result = "failure";

        try {
            /*异步通知签名*/
            boolean signVerified = AlipaySignature.rsaCheckV1(
                    params,
                    env.getProperty("ali-pay.alipay-public-key"),
                    AlipayConstants.CHARSET_UTF8,
                    AlipayConstants.SIGN_TYPE_RSA2 //调用SDK验证签名
            );
            if(!signVerified){
                //验签失败则记录异常日志，并在response中返回failure.
                log.error("支付成功异步通知验签失败！");
                return result;
            }
            //按照支付结果异步通知中的描述，对支付结果中的业务内容进行二次校验
            //1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号
            String outTradeNo = params.get("out_trade_no");
            Orders orders = orderService.getById(outTradeNo);
            if(orders == null){
                log.error("订单不存在");
                return result;
            }
            //2 判断 total_amount 是否确实为该订单的实际金额（即商户订单创建时的金额）
            String total_amount = params.get("total_amount");
            String order_amount = orders.getAmount().toString();
            if(!total_amount.equals(order_amount)){
                log.error("订单支付金额不符：支付金额{},订单金额{}",total_amount,order_amount);
                return result;
            }
            //3 校验通知中的 seller_id(商户ID)是否为 out_trade_no 这笔单据的对应的操作方
            String sellerId = params.get("seller_id");
            String sellerIdProperty = env.getProperty("ali-pay.seller-id");
            if(!sellerId.equals(sellerIdProperty)){
                log.error("商家pid校验失败");
                return result;
            }
            //4 验证 app_id 是否为该商户本身
            String appId = params.get("app_id");
            String appIdProperty = env.getProperty("ali-pay.app-id");
            if(!appId.equals(appIdProperty)){
                log.error("appid校验失败");
                return result;
            }
            //在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS时，
            // 支付宝才会认定为买家付款成功。
            String tradeStatus = params.get("trade_status");
            if(!"TRADE_SUCCESS".equals(tradeStatus)){
                log.error("支付未成功");
                return result;
            }
            //处理业务 修改订单状态 记录支付日志
            String s = alipayService.processOrder(params);
            if(!s.equals("success")){
                log.error("订单状态修改失败！");
                return result;
            }

        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        log.info("返回success");
        result = "success";
        return result;

    }


    /**
     * 查询订单:测试订单状态用
     * @param orderId
     * @return
     * @throws Exception
     */
    @GetMapping("/query/{orderId}")
    public R queryOrder(@PathVariable String orderId) {
        log.info("查询订单");
        String result = alipayService.queryOrder(orderId);
        return R.success(result);
    }

}
